package com.cskaoyan.javase.oop2._1extend._9final._3variable._2member;

/**
 * @description: final修饰成员变量
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * final修饰成员变量,表示该成员变量成为常量
 * 语法: [访问权限修饰符] final 数据类型 变量名;
 *
 * 在这个语法中,成员"常量"的赋值不能依赖于默认值,必须明确指出它的值,不然会报错
 * 成员变量的赋值方式:
 *      1,显式赋值
 *      2,构造代码块赋值
 *      3,构造器赋值
 * 以上三种赋值方式选择其一即可,并且也只能选择其中一种,因为是常量,只能赋值一次
 * 需要注意,使用构造器赋值时,必须严格保证每个构造器都能赋值,否者也会报错
 *
 * 成员"常量"是不是真正的常量呢?
 * 它仍然属于对象,仍然是每个对象中都有一份,这就意味着每个对象中它的常量值都可能不同
 * 这不是真正意义上的常量,在实际开发中很少使用
 * 如果想要使用真正意义上的常量,需要final修饰静态成员变量
 *
 */
public class Demo {
    public static void main(String[] args) {
        Student s = new Student(19);
        //s.AGE = 20;
        Student s2 = new Student(29);
    }
}

class Student{
    //Variable 'AGE' might not have been initialized
    public final int AGE;
    {
        //AGE = 10;
    }

    public Student(int AGE){
        this.AGE = AGE;
    }

    public Student() {
        AGE = 18;
    }
}